package itheima.jdk8.stream;


import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author Euphy
 * 分组，返回map当中的key就是分组的条件
 * gourpingby当中的各种神奇操作：
 */
public class StreamTest13 {

    public static void main(String[] args) {
        Student student1 = new Student("zhangsan", 100, 20);
        Student student2 = new Student("lisi", 90, 20);
        Student student3 = new Student("wangwu", 90, 30);
        Student student4 = new Student("zhangsan", 80, 40);

        List<Student> students = Arrays.asList(student1, student2, student3, student4);

        //01需求一：按照姓名分组
        //select * from 表 groupby name;
        /**
         * 循环列表，取出学生的名字，检查map中是否存在该名字，不存在直接添加到map中
         */
//        Map<String, List<Student>> map = students.stream().collect(Collectors.groupingBy(Student::getName));


       //02根据什么条件分组，那个分组的条件就是 返回map当中的 key
        /*{100=[jdk8.stream.Student@2d554825],
        90=[jdk8.stream.Student@68837a77, jdk8.stream.Student@6be46e8f, jdk8.stream.Student@3567135c]}
         */
//        Map<Integer, List<Student>> map = students.stream().collect(Collectors.groupingBy(Student::getScore));

        //select * name,count(*) from 表



        //03我想返回具体的分组内部的个数： counting
//        Map<String, Long> map = students.stream().
//                collect(Collectors.groupingBy(Student::getName, Collectors.counting()));


        //04获取平均值以上的数据
//        final Map<String, Double> map = students.stream().
//                collect(Collectors.groupingBy(Student::getName, Collectors.averagingDouble(Student::getScore)));


        //05 分区可以认为是分组的另一中情况,取得大于90的那个分组
        //返回一个 true 和false 二分的区域
        Map<Boolean, List<Student>> map = students.stream().
                collect(Collectors.partitioningBy(student -> student.getScore() >= 90));

        //注意当参数只有一个的时候 小括号可以省略
        //但是如果是多个的时候就，必须加上
        // 05.1方法体使用{}来表示

          map.forEach((k,v)->{
              if(k){
                  System.out.println("传说中大于90的："+k+"："+v);
                  v.forEach(w->{
                      System.out.println(w.getName()+":"+w.getScore());
                  });
              }
              System.out.println(k+"："+v);
          });

          //05.2 或者是 这样写更加的简便
        map.get(true).forEach(w->{
            System.out.println(w.getName()+":"+w.getScore());
        });

        System.out.println(map);


    }
}
